package hihocoder;
import java.util.Scanner;

/**
 * 
 */

/**找到用1~n*m填充n*m大小的矩阵，有多少种方法
 * @author zhongfang
 *
 */
public class 矩阵填数 {

	static int count=0;
//	static int x[];
	static void getResult(boolean taken[],int m,int n,int curCount){
		if(curCount>=n*m-1){//到了最后一个
			count++;
//			for (int integ : x) {
//				System.out.print(integ);
//			}
//			System.out.println();
			if(count==1000000007)
				count=0;
			return;
		}
		//第i行第j个可以取的范围是
		int i=curCount/m;
		int j=curCount%m;//j=0~m-1
		int low=i*j+i+j+1;
		int high=j*n+i*m-i*j+1;
		for (int k = low; k <= high; k++) {
			if(taken[k]==false){//位置i，j尝试放k
				taken[k]=true;
//				x[curCount]=k;
//				System.out.println("curCount "+curCount+" i "+i+"  j "+j+" low "+low+"  high "+high);
//				System.out.println(k);
				getResult(taken, m, n,curCount+1);
				taken[k]=false;
			}
		}
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		int n=scanner.nextInt();
		int m=scanner.nextInt();
		boolean[] taken=new boolean[n*m+1];
//		x=new int[n*m];
		getResult(taken, m, n, 0);
		System.out.println(count);
	}
}
